home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / a_utils / perl / prlbkxmp.lha / ch6 / sl < prev    next >
Text File  |  1991-01-08  |  2KB  |  83 lines

  1. #!/usr/bin/perl
  2.  
  3. # Usage: sl [filenames]
  4.  
  5. die "Usage: sl [filenames]\n" unless @ARGV;
  6.  
  7. # Preliminaries.
  8.  
  9. $| = 1;
  10. chop($cwd = `pwd`) || die "Can't find current directory: $!\n"
  11.     if @ARGV > 1;
  12. print "\n";
  13.  
  14. # Do each name.
  15.  
  16. foreach $name (@ARGV) {
  17.     @indent = ();
  18.     print "$name:\n";
  19.     @path = split(m;/;, $name);
  20.  
  21.     # Make an absolute path relative to /.
  22.  
  23.     if (@path && $path[0] eq '') {
  24.     chdir '/';
  25.     shift @path;
  26.     print '/';
  27.     $indent = 1;
  28.     }
  29.  
  30.     # Now follow the subdirectories and links.
  31.  
  32.     while (@path) {
  33.     $elem = shift @path;
  34.     $new = readlink($elem);
  35.     if (defined $new) {     # A symbolic link.
  36.         print "$elem -> $new\n";
  37.         $new =~ s!^\./!!;
  38.  
  39.         # Prepend symbolic link to rest of path.
  40.  
  41.         unshift(@path,split(m;/;, $new));
  42.  
  43.         # Deal with special cases.
  44.  
  45.         if (@path && $path[0] eq '') {
  46.  
  47.         # Absolute path starts over.
  48.  
  49.         chdir '/';
  50.         shift @path;
  51.         print '/';
  52.         $indent = 1;
  53.         @indents = ();
  54.         next;
  55.         }
  56.  
  57.         # Back up the tree as necessary.
  58.  
  59.         while (@indents && $path[0] eq '..') {
  60.         $indent = pop(@indents);
  61.         chdir '..'
  62.             || die "\n\nCan't cd to ..: $!\n";
  63.         shift @path;
  64.         }
  65.  
  66.         print "\t" x ($indent / 8), ' ' x ($indent % 8);
  67.     }
  68.     else {                  # An ordinary directory.
  69.         print $elem;
  70.         push(@indents,$indent);
  71.         $indent += length($elem) + 1;
  72.         if (@path) {
  73.         print '/';
  74.         chdir $elem
  75.             || die "\n\nCan't cd to $elem: $!\n";
  76.         }
  77.     }
  78.     }
  79.     print "\n\n";
  80.     $indent = 0;
  81.     chdir $cwd || die "Can't cd back: $!\n" if $cwd ne '';
  82. }
  83.